module SPI_rx (
    input SPI_en,
    input sys_rst_n,      //外部复位信号，低有效
    input SPI_clk,        //DSP发送时钟的两倍
    input SPI_txd,        //FSI接收端口
    output reg rx_done,        //接收一帧数据完成的标志信号
    output reg[15:0] rx_data         //接收的数据
);
//寄存器定义
reg rxd_d0;
reg rxd_d1;
reg buffer;
reg rx_flag;
reg [ 7:0] rx_cnt;
reg [ 15:0] rxdata;
//线定义 
wire start_flag;

//**********************************************
//**            main code
//**********************************************
//数据边沿监测
assign start_flag = rxd_d1&(~rxd_d0); 
//assign start_flag = ~SPI_en; 

always @(posedge SPI_clk or negedge sys_rst_n)
begin
    if(!sys_rst_n)
    begin
        rxd_d0<=1'b0;
        rxd_d1<=1'b0;
        buffer<=1'b0;
    end
    else begin
        rxd_d0<=SPI_txd;//涓嶆柇鍒锋柊鐩搁偦鐨勪袱涓€间互妫€娴嬭捣濮嬩綅鐨勫嚭鐜
        rxd_d1<=rxd_d0;
//        buffer<=SPI_txd;
    end
end

always @(negedge SPI_clk or negedge sys_rst_n)
begin
    if(!sys_rst_n)
        rx_flag<=1'b0;
    else begin
            if(start_flag)
            rx_flag<=1'b1;
        else if(rx_cnt==8'd16)
        begin
            rx_flag<=1'b0;
        end
        else
            rx_flag<=rx_flag;
    end
end

always @(posedge SPI_clk or negedge sys_rst_n)
begin
    if(!sys_rst_n)
        rx_cnt<=8'b0;
    else if(rx_flag)
          if(rx_cnt<16)  
            rx_cnt<=rx_cnt+1'b1;
          else
            rx_cnt<=rx_cnt;
    else
        rx_cnt<=8'd0;
end

always @(negedge SPI_clk or negedge sys_rst_n)
begin
    if(!sys_rst_n)
        rxdata<=16'b0;
    else if(rx_flag)
    begin
//    rxdata[0] <= 1; 
        case(rx_cnt)
             8'd1 : rxdata[0] <= rxd_d1; 
             8'd2 : rxdata[1] <= rxd_d1;
             8'd3 : rxdata[2] <= rxd_d1;
             8'd4 : rxdata[3] <= rxd_d1;
             8'd5 : rxdata[4] <= rxd_d1;
             8'd6 : rxdata[5] <= rxd_d1;
             8'd7 : rxdata[6] <= rxd_d1;
             8'd8 : rxdata[7] <= rxd_d1;
             8'd9 : rxdata[8] <= rxd_d1;   //瀵勫瓨鏁版嵁浣嶆渶楂樹綅
             8'd10 : rxdata[9] <= rxd_d1;   //瀵勫瓨鏁版嵁浣嶆渶浣庝綅
             8'd11 : rxdata[10] <= rxd_d1;
             8'd12 : rxdata[11] <= rxd_d1;
             8'd13 : rxdata[12] <= rxd_d1;
             8'd14 : rxdata[13] <= rxd_d1;
             8'd15 : rxdata[14] <= rxd_d1;
             8'd16 : rxdata[15] <= rxd_d1;    
             default:;
             endcase
         end
    else
        rxdata<=16'b0;
end    
    
always @(posedge SPI_clk or negedge sys_rst_n)
begin
    if(!sys_rst_n)
    begin
        rx_data<=16'b0;
        rx_done<=1'b0;
    end
    else if(rx_cnt==8'd16)
    begin
        rx_data<=rxdata;
        rx_done<=1'b1;
    end
    else begin
        
//        rx_data<=16'b0;
        rx_done<=1'b0;
    end
end

endmodule
    
    